#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>

//函数指针类型：
typedef void (*func_t)();
#define NUM 5
func_t handers[NUM+1];

void DownLoad()
{
    printf("我是一个下载的任务\n");
}
void Flush()
{
    printf("我是一个刷新的任务\n");
}
void Log()
{
    printf("我是一个记录日志的任务\n");
} 

//注册
void registerhanders(func_t h[],func_t f)
{
    int i=0;
    for(;i<NUM;i++)
    {
        if(h[i]==NULL)
        {
            break;
        }
    }
    if(i==NUM)
    {
        return;
    }
    h[i]=f;
    h[i+1]=NULL;
}
int main()
{
    //注册函数：
    registerhanders(handers,DownLoad);
    registerhanders(handers,Flush);
    registerhanders(handers,Log);


    pid_t id=fork();
    int status;
    if(id==0)
    {
        //child
        printf("我是一个子进程，我的PID是%d，父进程PID为%d\n",getpid(),getppid());
        sleep(5);
    }
    else if(id>0)
    {
        //parent
        while(1)
        {
            int ret=waitpid(id,&status,WNOHANG);
            if(ret==0)
            {
                printf("轮询结束，子进程未退出！\n");
            }
            else if(ret>0)
            {
                printf("轮询结束，子进程退出！\n");
                break;
            }
            else
            {
                //ret<0
                perror("waitpid fail!\n");
                break;
            }
            sleep(1);
            //printf("这是父进程代码！\n");
            for(int i=0;i<NUM;i++)
            {
                if(handers[i]!=NULL)
                handers[i]();
            }
       }
    }
    else
    {
        //id<0
        //fork fail!
        perror("fork fail!");
    }
    return 0;
}
//int main()
//{
//    pid_t id=fork();
//    int status;
//    if(id==0)
//    {
//        //child
//        printf("我是一个子进程，我的PID是%d，父进程PID%d\n",getpid(),getppid());
//        sleep(10);
//        exit(0);
//    }
//    else if(id>0)
//    {
//        //parent
//        pid_t ret=waitpid(id,&status,0);
//        if(ret>0)
//        {
//            printf("wait success!\n");
//        }
//        else
//        {
//            printf("wait fail!\n");
//        }
//        printf("这是父进程的后续代码\n");
//    }
//    else
//    {
//        perror("fork fail!");
//    }
//    return 0;
//}
